home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-08-23 | 11.9 KB | 490 lines | [TEXT/PJMM] |
- unit Preferences;
- { DeHQX v2.0.0 © Peter Lewis, Aug 1991 }
-
- interface
-
- uses
- MyTypes, MyUtilities, MyFileSystem, MyStandardFile, Folders, MySystem7, AppGlobals;
-
- type
- { DONT REORDER THIS RECORD OR THESE TYPES! }
- promptStates = (PS_Always, PS_Exists, PS_Overwrite, PS_Unique, PS_Skip);
- createDirStates = (CDS_Always, CDS_Folder, CDS_Never);
- displayStates = (DS_All, DS_TEXT, DS_HQX);
- preferencesType = record
- version: integer;
- prompt_state: promptStates;
- create_dir_state: createDirStates;
- display_state: displayStates;
- beep_state: boolean;
- delete_state: boolean;
- parts_state: boolean;
- startup_state: boolean;
- auto_quit_state: boolean;
- notify_state: boolean;
- demand_thisfile_state: boolean;
- {space for future expansion (rapidly shrinking!) }
- dummy4, dummy5, dummy6: boolean; { not packed }
- {added for version 1.1.2 }
- drop_folder: boolean; { drop folder enabled }
- drop_dirID: longInt; { -1 for invalid directories }
- case boolean of
- true: ( { In memory }
- drop_vrn: integer
- );
- false: ( { On Disk }
- drop_CrDate: longInt;
- drop_Volume: str63
- );
- end;
-
- const
- Pref_Save_item = 1;
- Pref_Default_Item = Pref_Save_item;
- Pref_Cancel_item = 2;
- Pref_OK_item = 3;
-
- var
- prefs: preferencesType;
- prefs_dialog: dialogPtr; { nil if no window open }
-
- procedure InitPreferences;
- function FinishPreferences: boolean;
- procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63); { used for ODoc/Params }
- procedure OpenPreferences;
- procedure HandlePrefItem (item: integer);
- procedure ClosePreferences;
-
- implementation
-
- const
- nonotify_version = $102;
- notify_version = $106;
- pre_drop_size = 16;
- drop_version = $112;
- current_version = $112;
- User_item = 4;
- PS_item = 5;
- PS_items = 5;
- PS_iteml = PS_item + PS_items - 1;
- CDS_item = 10;
- CDS_items = 3;
- CDS_iteml = CDS_item + CDS_items - 1;
- DS_item = 13;
- DS_items = 3;
- DS_iteml = DS_item + DS_items - 1;
- PaS_item = 16;
- DTFS_item = 17;
- StS_item = 18;
- DFS_item = 19;
- DeS_item = 20;
- BeS_item = 21;
- FAS_item = 22;
- AQS_item = 23;
- DFB_item = 24;
-
- type
- prefP = ^preferencesType;
- prefH = ^prefP;
-
- var
- noAlert: boolean;
- prefVRN: integer;
- prefDirID: longInt;
- dialog_vrn: integer;
- dialog_DirID: longInt;
- prefs_dialog_dirty: boolean;
-
- procedure GetPrefVRN;
- var
- oe: OSErr;
- vrn: integer;
- crdate: longInt;
- begin
- with prefs do begin
- if (drop_volume = '') or (drop_dirID = -1) then
- oe := myErr
- else begin
- vrn := 0;
- oe := GetVolInfo(drop_volume, vrn, -1, crdate);
- if (oe = noErr) and (crdate <> drop_crdate) then
- oe := myErr;
- if oe = noErr then
- if not MFSDirExists(vrn, drop_dirID, '') then
- oe := myErr;
- end;
- if oe <> noErr then
- drop_folder := false;
- if oe = noErr then begin
- drop_vrn := vrn;
- end
- else begin
- drop_vrn := 0;
- drop_dirID := -1;
- end;
- end;
- end;
-
- procedure InitPreferences;
- var
- oe: OSErr;
- name: str63;
- pb: HParamBlockRec;
- h: prefH;
- wd: integer;
- begin
- noAlert := false;
- with prefs do begin
- version := current_version;
- prompt_state := PS_Exists;
- create_dir_state := CDS_Folder;
- display_state := DS_TEXT;
- beep_state := true;
- delete_state := false;
- parts_state := true;
- startup_state := true;
- auto_quit_state := false;
- notify_state := true;
- demand_thisfile_state := false;
- dummy4 := false;
- dummy5 := false;
- dummy6 := false;
- drop_folder := false;
- drop_DirID := -1;
- drop_Volume := '';
- end;
- h := prefH(GetResource(pref_rsrc, pref_id));
- if h <> nil then begin
- prefs := h^^;
- ReleaseResource(handle(h));
- end;
- prefVRN := sysenv.sysVRefNum;
- prefDirID := 0;
- oe := GetDirID(prefVRN, prefVRN, prefDirID);
- oe := MyFindFolder(prefVRN, kPreferencesFolderType, prefVRN, prefDirID);
- GetPrefVRN;
- noAlert := true;
- GetPreferences(prefVRN, prefDirID, GetGlobalString(pref_name));
- noAlert := false;
- prefs_dialog := nil;
- end;
-
- procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);
- var
- oe: OSErr;
- rn, a: integer;
- p: preferencesType;
- count: longInt;
- begin
- oe := MyResolveAliasFile(wdrn, dirID, name);
- if oe = noErr then
- oe := MFSOpenDF(rn, wdrn, dirID, name, PIn);
- if oe = noErr then begin
- count := SizeOf(preferencesType);
- oe := FSRead(rn, count, @p);
- if oe = eofErr then
- oe := noErr;
- if (count = pre_drop_size) and (p.version < drop_version) then begin
- p.drop_folder := false;
- p.drop_DirID := -1;
- p.drop_Volume := '';
- count := SizeOf(preferencesType);
- end;
- if count <> SizeOf(preferencesType) then
- oe := myErr;
- if oe = noErr then begin
- prefs := p;
- if prefs.version < notify_version then
- prefs.notify_state := true;
- prefs.version := current_version;
- GetPrefVRN;
- end
- else if not noAlert then
- a := Alert(pref_read_alert_id, nil);
- oe := FSClose(rn);
- end;
- end;
-
- procedure SaveDefaults;
- var
- oe: OSErr;
- rn, a: integer;
- count: longInt;
- p: preferencesType;
- name: str63;
- crdate: longInt;
- begin
- p := prefs;
- with p do begin
- if drop_dirID = -1 then
- oe := myErr
- else begin
- name := '';
- oe := GetVolInfo(name, drop_vrn, -1, crdate);
- end;
- if oe = noErr then begin
- drop_volume := name;
- drop_CrDate := crdate;
- end
- else begin
- drop_folder := false;
- drop_DirID := -1;
- drop_CrDate := 0;
- drop_Volume := '';
- end;
- end;
- oe := MFSCreate(prefVRN, prefDirID, GetGlobalString(pref_name), myAppType, myAppType);
- oe := MFSOpenDF(rn, prefVRN, prefDirID, GetGlobalString(pref_name), POut);
- if oe = noErr then begin
- count := SizeOf(preferencesType);
- oe := FSWrite(rn, count, @p);
- if count <> SizeOf(preferencesType) then
- oe := myErr;
- if (oe <> noErr) and not noAlert then
- a := Alert(pref_write_alert_id, nil);
- if oe = noErr then
- oe := FSClose(rn);
- end;
- end;
-
- function FinishPreferences: boolean;
- begin
- if prefs_dialog <> nil then
- ClosePreferences;
- FinishPreferences := prefs_dialog <> nil;
- end;
-
- function GetControl (dp: dialogPtr; item: integer): boolean;
- var
- kind: integer;
- r: rect;
- h: controlHandle;
- begin
- GetDItem(dp, item, kind, handle(h), r);
- GetControl := GetCtlValue(h) <> 0;
- end;
-
- procedure SetControl (dp: dialogPtr; item: integer; on: boolean);
- var
- kind: integer;
- r: rect;
- h: controlHandle;
- begin
- GetDItem(dp, item, kind, handle(h), r);
- SetCtlValue(h, ord(on));
- prefs_dialog_dirty := true;
- end;
-
- procedure SetControls (dp: dialogPtr; first, count, value: integer);
- var
- i: integer;
- begin
- for i := 0 to count - 1 do
- SetControl(dp, first + i, i = value);
- end;
-
- function GetControls (dp: dialogPtr; first, count: integer): integer;
- var
- i: integer;
- begin
- GetControls := 0;
- for i := 0 to count - 1 do
- if GetControl(dp, first + i) then
- GetControls := i;
- end;
-
- procedure SetDropButton (dp: dialogPtr; folder: boolean; vrn: integer; dirID: longInt);
- var
- pb: HParamBlockRec;
- name: str255;
- oe: OSErr;
- kind: integer;
- h: handle;
- r: rect;
- begin
- dialog_vrn := vrn;
- dialog_dirID := dirID;
- if dirID = -1 then
- oe := myErr
- else
- with pb do begin
- ioNamePtr := @name;
- ioVRefNum := vrn;
- ioFDirIndex := -1;
- ioDirID := dirID;
- oe := PBGetCatInfo(@pb, false);
- end;
- if oe <> noErr then begin
- name := GetGlobalString(no_drop_folder);
- folder := false;
- end;
- SetControl(dp, DFS_item, folder);
- GetDItem(dp, DFB_item, kind, h, r);
- SetCTitle(controlHandle(h), name);
- prefs_dialog_dirty := true;
- end;
-
- procedure SetDialog (dp: dialogPtr);
- begin
- with prefs do begin
- SetControls(dp, PS_item, PS_items, ord(prompt_state));
- SetControls(dp, CDS_item, CDS_items, ord(create_dir_state));
- SetControls(dp, DS_item, DS_items, ord(display_state));
- SetControl(dp, BeS_item, beep_state);
- SetControl(dp, DeS_item, delete_state);
- SetControl(dp, PaS_item, parts_state);
- SetControl(dp, DTFS_item, demand_thisfile_state);
- SetControl(dp, StS_item, startup_state);
- SetControl(dp, AQS_item, auto_quit_state);
- SetControl(dp, FAS_item, notify_state);
- SetDropButton(dp, drop_folder, drop_vrn, drop_DirID);
- end;
- end;
-
- procedure SetPrefs (dp: dialogPtr);
- begin
- with prefs do begin
- prompt_state := promptStates(GetControls(dp, PS_item, PS_items));
- create_dir_state := createDirStates(GetControls(dp, CDS_item, CDS_items));
- display_state := displayStates(GetControls(dp, DS_item, DS_items));
- beep_state := GetControl(dp, BeS_item);
- delete_state := GetControl(dp, DeS_item);
- parts_state := GetControl(dp, PaS_item);
- demand_thisfile_state := GetControl(dp, DTFS_item);
- startup_state := GetControl(dp, StS_item);
- auto_quit_state := GetControl(dp, AQS_item);
- notify_state := GetControl(dp, FAS_item);
- drop_folder := GetControl(dp, DFS_item);
- drop_dirID := dialog_dirID;
- drop_vrn := dialog_vrn;
- end;
- end;
-
- procedure OutlineDefault (dp: dialogPtr; item: integer);
- var
- kind: integer;
- h: handle;
- r: rect;
- begin
- GetDItem(dp, Pref_Default_item, kind, h, r);
- PenSize(3, 3);
- InsetRect(r, -4, -4);
- FrameRoundRect(r, 16, 16);
- end;
-
- procedure OpenPreferences;
- var
- item: integer;
- kind: integer;
- h: handle;
- r: rect;
- begin
- if prefs_dialog <> nil then begin
- if FrontWindow <> prefs_dialog then
- SelectWindow(prefs_dialog);
- end
- else begin
- SetVersionParamText('', '');
- prefs_dialog := GetNewDialog(pref_dialog_id, nil, POINTER(-1));
- GetDItem(prefs_dialog, Pref_Default_item, kind, h, r);
- InsetRect(r, -10, -10);
- SetDItem(prefs_dialog, User_item, userItem, handle(@OutlineDefault), r);
- SetDialog(prefs_dialog);
- prefs_dialog_dirty := false;
- ShowWindow(prefs_dialog);
- end;
- end;
-
- procedure HandlePrefItem (item: integer);
- procedure CheckClick (item: integer);
- begin
- SetControl(prefs_dialog, item, not GetControl(prefs_dialog, item));
- end;
- var
- reply: MySFReply;
- typeList: SFTypeList;
- dfs: boolean;
- begin
- with prefs do begin
- case item of
- PS_item..PS_iteml:
- SetControls(prefs_dialog, PS_item, PS_items, item - PS_item);
- CDS_item..CDS_iteml:
- SetControls(prefs_dialog, CDS_item, CDS_items, item - CDS_item);
- DS_item..DS_iteml:
- SetControls(prefs_dialog, DS_item, DS_items, item - DS_item);
- BeS_item:
- CheckClick(BeS_item);
- DeS_item:
- CheckClick(DeS_item);
- PaS_item:
- CheckClick(PaS_item);
- DTFS_item:
- CheckClick(DTFS_item);
- StS_item:
- CheckClick(StS_item);
- AQS_item:
- CheckClick(AQS_item);
- FAS_item:
- CheckClick(FAS_item);
- DFS_item:
- begin
- if GetControl(prefs_dialog, DFS_item) then
- SetControl(prefs_dialog, DFS_item, false)
- else if dialog_dirID = -1 then begin
- GetFolder(nil, -1, typeList, get_folder_id, reply);
- with reply do
- if Rgood then
- SetDropButton(prefs_dialog, true, RvRefNum, RdirID);
- end
- else
- SetControl(prefs_dialog, DFS_item, true);
- end;
- DFB_item:
- begin
- if dialog_dirID <> -1 then
- SetSFFile(dialog_vrn, dialog_dirID);
- GetFolder(nil, -1, typeList, get_folder_id, reply);
- with reply do
- if Rgood then
- SetDropButton(prefs_dialog, true, RvRefNum, RdirID);
- end;
- Pref_Save_item, Pref_OK_item, Pref_Cancel_item:
- begin
- if prefs_dialog_dirty and (item <> Pref_Cancel_item) then begin
- SetPrefs(prefs_dialog);
- if item = Pref_Save_item then
- SaveDefaults;
- end;
- DisposDialog(prefs_dialog);
- prefs_dialog := nil;
- end;
- otherwise
- ;
- end;
- end;
- end;
-
- procedure ClosePreferences;
- var
- dp: dialogPtr;
- a: integer;
- begin
- if prefs_dialog_dirty then begin
- if FrontWindow <> prefs_dialog then
- SelectWindow(prefs_dialog);
- a := Alert(pref_save_changes_alert_id, nil); { 1=Save, 2 = Cancel, 3=Discard }
- end
- else
- a := 3;
- if a = 1 then begin
- SetPrefs(prefs_dialog);
- SaveDefaults;
- end;
- if a <> 2 then begin
- DisposDialog(prefs_dialog);
- prefs_dialog := nil;
- end;
- end;
-
- end.